********************************************** River City Ransom Password Algorithm v0.0 2004.11.15 Author: Jerry McMahan Jr. (jerry@ensomnya.net) ********************************************** ******* Copying ******* This text is freely redistributable, as is. ******************* About This Document ******************* This text provides a description of the password algorithm for the NES version of River City Ransom. The information provided should allow the reader to generate passwords for a desired set of character data, or to determine the character data associated with a particular password and check it's validity. The information presented was reverse-engineered from the game, so there may be some errors. If you find any errors, email me at jerry@ensomnya.net and let me know about them. ************* Prerequisites ************* To understand the material in this text, you'll need to have an understanding of binary numbers and Boolean logic. Actually, you may be able to do without it and pick it up along the way, but it'll make things a lot easier. You will also need to know what binary coded decimal is, to understand how the money values are stored. You can find that in a lot of places online. Here's a good description: http://en.wikipedia.org/wiki/Binary_coded_decimal ***************** Table of Contents ***************** 1. Introduction 2. Password Description 2.1 Data Stored in Each Position of the Password 2.2 Password Algorithm 3. Numeric Values of Inventory Items 4. Credits *************** 1. Introduction *************** River City Ransom is notorious for its annoyingly long password system. The player is required to enter 33 characters on a menu screen. Any mistakes in copying just one of those characters will probably cause the password to fail. Partly out of a desire to provide a correction for this, and partly out of curiousity and boredom, I reverse-engineered the password system. I've not done much checking on how correct this information is, but all the checking I've done so far has shown has verified this info. Interestingly, the information here can be used to generate passwords that give your character stats, inventory items, or skills that aren't possible to get through normal play. As a few examples of things I've tried out that worked, I generated a password to give my character a punch value of 0, to carry a "Smile" in his inventory, to equip a donut (that is, have a '#' next to it, as in books that are read or shoes that are worn), and to have the "Stone Hands" ability without having the "Stone Hands" book in my inventory. There are probably a lot more things you can do, but I just haven't tried. As an interesting side note, if the information I've found about the password system is thorough and completely correct, then there are 562013623917344407265358750030539723015559577600000 valid passwords for River City Ransom. The number of possible passwords you can enter, both valid and invalid, is 124 to the 33rd power, or 1210362919824851463371550738227065461619969130596515513717925687066624. That means that if you were to randomly enter values into the password system, you'd have about a 1 in 2 quintillion (2 with 18 zeros after it) to enter a working password. Actually, I may be wrong about the above, but it sounds good anyway. The information is presented in a kind of awkward manner, as it's mostly reference information. It might be easier to look at the "Examples" section first, and then use the other sections as reference. Finally, for those interested, I've built written a password generator and decrypter, both of which have a web interface. These tools, along with the source code (in Python) are located at my website, here: http://ensomnya.net/projects/rcr_password/index.html (I apologize for the blatant plug of my website.) It's assumed that there are bugs in these programs, but so far they've been tested to work properly (I've even used them to make corrections in a couple of incorrect passwords listed on GameFAQ). If there's some point that I've not made clear enough in this text, or if you have any comments, email me at jerry@ensomnya.net, and I'll see if I can help you - and maybe, in the process, improve this document. *********************** 2. Password Description *********************** The password system is actually a lot simpler than it might appear. For a given set of character data, there are 32 passwords that represent that data, corresponding with a key included with the password. This accounts for seeing different passwords upon entering and exiting the password screen several times in a row. If you do it enough times, you'll eventually begin to see the same passwords reappear. The aforementioned key is the last letter in the password. It can take on one of 32 values, 'A' through 'Z' or 'a' through 'f'. The key is used in the algorithm to encrypt or decrypt the character data, as will be explained below. ************************************************ 2.1 Data Stored in Each Position of the Password ************************************************ Each letter in the password represents a certain value in the game which will now be explained. The password is always of the following format, where each of the following numbers represents a position in the password: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 For example, in the password, C K X I E e S f q s X J P 5 f M U F D W G M S H K L b S O N M O A 01 = C, 02 = K, 03 = X, 04 = I, and so on. Except for position 33, the raw value represented by each character in each of these positions can range from 0 to 63. For position 33, it ranges from 0 to 31. The values represented by each of these characters in these positions follows. An overview is presented, followed by a more in-depth description of each of the values. Summary: 01 - Punch 02 - Kick 03 - Weapon 04 - Throwing 05 - Agility 06 - Defense 07 - Strength 08 - Will Power 09 - Lower bits of Stamina 10 - Lower bits of Max Power 11 - High bits of Stamina and Max Power 12 - Active skills 13 - Lower bits of cents in money 14 - Lower bits of ones and tens digits in money 15 - Lower bits of hundreds digit in money 16 - High bits of cents, ones & tens digits, and hundreds digits 17 - Lower bits of inventory slot 1 18 - Lower bits of inventory slot 2 19 - High bits of inventory slot 1 and 2 20 - Lower bits of inventory slot 3 21 - Lower bits of inventory slot 4 22 - High bits of inventory slot 3 and 4 23 - Lower bits of inventory slot 5 24 - Lower bits of inventory slot 6 25 - High bits of inventory slot 5 and 6 26 - Lower bits of inventory slot 7 27 - Lower bits of inventory slot 8 28 - High bits of inventory slot 7 and 8 29 - Bosses defeated 1 30 - Bosses defeated 2 31 - Bosses defeated 3 32 - "Checksum" of values in positions 01 through 31 33 - Password key In-depth: 01: The total value of Punch. 02: The total value of Kick. 03: The total value of Weapon. 04: The total value of Throwing. 05: The total value of Agility. 06: The total value of Defense. 07: The total value of Strength. 08: The total value of Will Power. 09: The first 6 bits of Stamina. 10: The first 6 bits of Max Power. 11: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. The highest bit of Stamina is in bit 2 and the highest bit of Max Power is in the bit 0. To reconstruct Stamina, you integer divide this value by four (that is, truncate the value), multiply the result by sixty-four, and add what you get to the value in position 09. To reconstruct Max Power, you take this value modulo 2 (or, equivalently, mask out the high 7 bits), multiply the result by 64, and add it to the value in position 10. 12: This value explains what fighting skills your character has. Each bit represents a value. If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, the bit values correspond to the different skills as follows bit 0 - Stone Hands bit 1 - Dragon Feet bit 2 - Grand Slam bit 3 - Acro Circus bit 4 - Javelin Man bit 5 - Fatal Steps A bit set to 1 means the skill is active. Otherwise, the skill is inactive. 13: The lowest 6 bits of the cents value (that is, the number of cents in your money statistic). For example, with $123.45, the cents value is "45". 14: The lowest 6 bits of the first two digits of the whole number portion of your money statistic. For example, with $123.45, the first two digits of the whole number portion of the money is "23". 15: The lowest 6 bits of the hundreds digit of your money statistic. For example, with $123.45, the hundreds digit is "1". 16: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. Bits 5 and 4 correspond to the highest bits (bits 7 and 6, respectively) of the cents value (from position 13). Bits 3 and 2 correspond to the highest bits (bits 7 and 6, respectively) of the value in position 14. Bits 1 and 0 correspond to the highest bits (bits 7 and 6, respectively) of the value in position 15. Supposedly, these bits will always be zero, because you're not supposed to be able to get more money than $999.99, but there is code in the game to store the high bits here in this value. Whether this has an effect on anything or not is unknown. The money is stored in binary-coded decimal, in three different variables, one for each of the values mentioned in the description of position 13, 14, and 15. So for a money statistic of "$99.00", the cents value would be 0, the ones and tens value would be 153 (because 153 is 0x99 in hexadecimal), and the hundreds value would be 0. 17: This is the first 6 bits of the value for the first inventory slot. The inventory items corresponding to the different values in these locations is listed in Section 5 of this document. 18: This is the first 6 bits of the value for the second inventory slot. 19: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. Bits 3 and 2 correspond to bits 7 and 6 of the value for the first inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for the second inventory slot. 20: This is the first 6 bits of the value for the third inventory slot. 21: This is the first 6 bits of the value for the fourth inventory slot. 22: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. Bits 3 and 2 correspond to bits 7 and 6 of the value for the third inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for the fourth inventory slot. 23: This is the first 6 bits of the value for the fifth inventory slot. 24: This is the first 6 bits of the value for the sixth inventory slot. 25: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. Bits 3 and 2 correspond to bits 7 and 6 of the value for the fifth inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for the sixth inventory slot. 26: This is the first 6 bits of the value for the seventh inventory slot. 27: This is the first 6 bits of the value for the eighth inventory slot. 28: If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. Bits 3 and 2 correspond to bits 7 and 6 of the value for the seventh inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for the eighth inventory slot. 29: The bits in the value stored in this position correspond to bosses you've defeated, or events you've gone through (like talking to Roxy or rescuing Cyndi). If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. bit 0 - Clyde bit 1 - Benny bit 2 - Thor bit 3 - Otis bit 4 - Ivan 30: The bits in the value stored in this position correspond to bosses you've defeated, or events you've gone through (like talking to Roxy or rescuing Cyndi). If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. bit 0 - Roxy bit 2 - Cyndi bit 3 - Moose bit 4 - Mojo bit 5 - Turk 31: The bits in the value stored in this position correspond to bosses you've defeated, or events you've gone through (like talking to Roxy or rescuing Cyndi). If you order the bits like so: |7|6|5|4|3|2|1|0| with bit 0 representing the least significant bit and bit 7 representing the most significant bit, then the following description applies. bit 0 - Rocko bit 1 - Blade bit 2 - Randy* bit 3 - Andy* *Note - I'm not sure if these are reversed or not. The twins look identical, so I'm not sure which one is which. But it really doesn't matter. 32: The "checksum" of the values in position 01 through 31. To calculate it, simply add all the values in positions 01 through 31 and keep only the lower 6 bits. If the value input here with the password doesn't match what the game calculates for the password, a "Wrong Password" error will occur. 33: This is the password key. It's a value ranging from 0 to 31 that is picked at random and used in the encoding / decoding of the password. It's used to create 32 different passwords for each set of character data. ********************** 2.2 Password Algorithm ********************** The password algorithm is pretty easy to follow. To encrypt a value, set up each position of the password with an appropriate value. Then for the first 32 positions, the following formula is applied: x_coded[x] = (key + kconstant[x]) XOR value[x] where x_coded[x] is the intermediate result, key is the value in position 33, kconstnat[x] is a special number that's different for each position and is always added as in the formula (probably to make the password appear more random and irregular), and value[x] is the value stored in the position. The "XOR" operation in the equation is a bitwise XOR operation - that is, it performs an XOR on each bit (like the "^" operator in C, and similar operators). The kconstant is as follows, with the position it refers to preceding the constant: Position Constant -------------------- 01: 13 02: 5 03: 24 04: 7 05: 11 06: 17 07: 29 08: 16 09: 21 10: 19 11: 23 12: 9 13: 15 14: 25 15: 31 16: 12 17: 20 18: 5 19: 3 20: 22 21: 6 22: 12 23: 18 24: 7 25: 10 26: 11 27: 27 28: 18 29: 14 30: 13 31: 12 32: 24 Notice that the final position, 33, doesn't have this constant added to it, or anything XOR'ed with it. Once these intermediate values are calculated, the number 192 is added to them. Then the resulting number is used as an index into the following table to generate the final password. Character Chart --------------- 255 = B' 254 = A' 253 = 9 252 = 8 251 = 7 250 = 6 249 = 5 248 = 4 247 = 3 246 = 2 245 = 1 244 = 0 243 = z 242 = y 241 = x 240 = w 239 = v 238 = u 237 = t 236 = s 235 = r 234 = q 233 = p 232 = o 231 = n 230 = m 229 = l 228 = k 227 = j 226 = i 225 = h 224 = g 223 = f 222 = e 221 = d 220 = c 219 = b 218 = a 217 = Z 216 = Y 215 = X 214 = W 213 = V 212 = U 211 = T 210 = S 209 = R 208 = Q 207 = P 206 = O 205 = N 204 = M 203 = L 202 = K 201 = J 200 = I 199 = H 198 = G 197 = F 196 = E 195 = D 194 = C 193 = B 192 = A It's worth noting from this chart that the only characters with accent mark following them (denoted by the single quote, ', following the letter) are A and B. As far as I can tell, there are never any passwords given by the game with the accent mark on any other character, although depending on what value they represent, it may be possible to generate passwords with them. That would require more research (and some kind of motivation) to find out. And that's it. To decrypt the passwords, just reverse the above steps. I was going to provide some examples, as I know it's a bit difficult to follow the real meaning of all this means with what I've written here, but I'll save that for a future improvement, if anyone requests it. For a working example, you can, as I mentioned above, look at the source code of the password generator and decrypter programs I've written that are available from my website at this URL: http://ensomnya.net/projects/rcr_password/index.html I don't really know anything about cryptography and what not, but I read an article online describing "One-Time Pad" ciphers, and that seems to be what this is. If anyone could confirm or correct that, I'd appreciate it. Have fun messing with these passwords. If you find anything that doesn't match up with the information in this document, email me and let me know. ************************************* 3. Numeric Values of Inventory Items ************************************* The following list has the value, followed by the item. I've found that sometimes the password will cause items with different descriptions to be placed in the inventory, but they seem to represent the same things as in this list. Also, items that you can't typically hold in your inventory seem to cause garbled messages to appear when you try to use them. The possible values actually go up to 255. However, once the value exceeds 127, the inventory item becomes the same as the item corresponding to the value that is 128 numbers below that number, only it has the "#" sign at the beginning (like when books are read). For example, if the value is 130, then the item will be 130 - 127 = 3, which is bagel, only it will have a "#" in front of it, making it "#bagel". 0 nothing 1 donut 2 muffin 3 bagel 4 honey_bun 5 croissant 6 sugar 7 toll_house 8 maple_pecan 9 oatmeal 10 brownie 11 mint_gum 12 lolly_pop 13 jaw_breaker 14 rock_candy 15 fudge_bar 16 salad_paris 17 onion_soup 18 cornish_hen 19 veal_walle 20 vita-mints 21 digestol 22 recharge! 23 karma_jolt 24 omni_elixir 25 date_saver 26 love_potion 27 antedote_12 28 r_&_b 29 rock 30 pop 31 soul 32 classical 33 sneakers 34 boat_shoes 35 loafers 36 army_boots 37 texas_boots 38 slippers 39 thongs 40 sandals 41 mod_boots 42 insoles 43 maze_craze 44 decathlete 45 hyper_ball 46 techno_belt 47 teddy_bear 48 stone_hands 49 dragon_feet 50 grand_slam 51 acro_circus 52 javelin_man 53 fatal_steps 54 scandal_rag 55 comic_times 56 mystic_seer 57 nuclear_spy 58 indian_lore 59 excaliber 60 zeus_wand 61 rodan_wing 62 gold_medal 63 isis_scroll 64 sirloin 65 rib-eye 66 t-bone 67 lamb_leg 68 merv_burger 69 cheese_merv 70 fish_merv 71 mondo_merv 72 milk 73 iced_tea 74 soda 75 merv_malt 76 merv_fries 77 merv_rings 78 apple_pies 79 spicy_chili 80 smile 81 chickwich 82 dark_meat 83 white_meat 84 combination 85 lemonade 86 gravy 87 biscuits 88 corn_cobber 89 cole_slaw 90 coffee 91 tea 92 hot_cocoa 93 pancakes 94 waffles 95 ice_cream 96 roman_shake 97 cola_float 98 nero_pizza 99 lasagna 100 fresh_juice 101 lemon_tea 102 herbal_tea 103 carrot_cake 104 pound_cake 105 egg 106 octopus 107 squid 108 conger_eel 109 prawn 110 salmon 111 ark_shell 112 sea_urchin 113 halibut 114 swordfish 115 salad_roll 116 tuna_roll 117 shrimp_roll 118 mixed_roll 119 egg_roll 120 fried_rice 121 garlic_pork 122 pepper_beef 123 chow_mein 124 sauna 125 no_thanks 126 nothing 127 main_menu ********** 4. Credits ********** Thanks to: - Technos for making such a cool game. - The makers of FCEU, as their debugger made this much easier to figure out, as did their emulator. - Zdravko Beikov, his "Ultimate Cheating Guide" listed some of the stat locations in memory, saving me the trouble of having to find them myself.